////////////////////////////////////////////////////////////////////////////////

#ifndef _SGAMEOBJECT_H_
#define _SGAMEOBJECT_H_

////////////////////////////////////////////////////////////////////////////////

#ifndef _COMMONTYPES_H_
#include "commontypes.h"
#endif

////////////////////////////////////////////////////////////////////////////////

class PhysicsEngine;
class ServerEngine;
class SPlayer;
class SBullet;
class SWall;

////////////////////////////////////////////////////////////////////////////////


/** Base class for different game objects
*
*  @author   Roman Pasechnik
*  @author   Anastasia Karpinska
*  @since    Nov 10th, 2009
*  @updated  Apr 18th, 2010
*/
class SGameObject
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    SGameObject( int _ID,
                 const Point& _position );


    /** Copy constructor */
    SGameObject( const SGameObject& _copy );


    /** Destructor */
    virtual ~SGameObject();


////////////////////////////////////////////////////////////////////////////////


    /** Returns object's ID */
    int GetID() const;


    /** Get object's position */
    const Point& GetPosition() const;


    /** Set object's position */
    void SetPosition(const Point& _position);


    /** Equality */
    bool operator==( const SGameObject& _obj ) const;


    /** Associate game object with physical body */
    void SetPhysicalObject( void* _physicalObject );


    /** Returns physical body */
    void* GetPhysicalObject() const;


////////////////////////////////////////////////////////////////////////////////
//// Collisions
////////////////////////////////////////////////////////////////////////////////


    /** Informs this object about collision with other object */
    virtual void Collision( SGameObject& _obj );


    /** Informs this object about collision with bullet */
    virtual void CollideWithBullet( SBullet& _bullet );


    /** Informs this object about collision with player */
    virtual void CollideWithPlayer( SPlayer& _player );


    /** Informs this object about collision with wall */
    virtual void CollideWithWall( SWall& _wall );


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Object's ID */
    int m_ID;


    /** Object's position */
    Point m_Position;


////////////////////////////////////////////////////////////////////////////////


    /** Physical object pointer */
    void* m_PhysicalObject;


////////////////////////////////////////////////////////////////////////////////

protected:

////////////////////////////////////////////////////////////////////////////////


    /** Must be killed! If it will, it is also possible to delete physical objects in destructor! */
    void UpdateObjectPointer();


////////////////////////////////////////////////////////////////////////////////
};



////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

